/*
 * 版权所有：义乌市路比信息科技有限公司
 * 作者：kinwyb<http://www.lcfgly.com>
 * 日期：2015-9-23
 */

package lcfgly.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Timer;
import org.apache.logging.log4j.core.config.Configurator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

/**
 * 主函数扩展，主要是用来控制执行不会退出，会等待用户数据输入
 * @author kinwyb<http://www.lcfgly.com>
 * @datetime 2015-9-23 17:04:10
 * @version 1.0
 */
public class MainUtil {

    /**
     * 扩展主函数可以使得程序不会直接退出
     * @param stateFilePath
     * @throws IOException 
     */
    public static void MainExtend(final String stateFilePath) throws IOException {
        Timer timer = new Timer("state");
        timer.schedule(new java.util.TimerTask() {
            @Override
            public void run() {
                try {
                    String s = readState(stateFilePath);
                    if(s == null)
                        return;
                    if (s.equalsIgnoreCase("exit") || s.equalsIgnoreCase("close") || s.equalsIgnoreCase("shutdown")) {
                        System.out.println("系统结束");
                        System.exit(1);
                    }
                } catch (IOException ex) {
                    System.out.println("定时任务执行错误:" + ex.getMessage());
                }
            }
        }, 0, 1 * 60 * 1000);
    }
    
    /**
     * 读取状态配置文件
     * @param stateFilePath
     * @return
     * @throws IOException 
     */
    private static String readState(String stateFilePath)throws IOException {
        File file = new File(System.getProperty("user.dir") + File.separator+stateFilePath);
        InputStream in=null;
        BufferedReader br=null;
        InputStreamReader inr=null;
        try {
            if (file.exists()) {
                in = new FileInputStream(file);
            } else {
                in=System.in;
            }
            inr =new InputStreamReader(in);
            br=new BufferedReader(inr);
            return br.readLine();
        } catch (FileNotFoundException ex) {
            System.out.println("状态读取错误:" + ex.getMessage());
            return "start";
        }finally{
            if(in != null)
                in.close();
            if(br != null)
                br.close();
            if(inr != null)
                inr.close();
        }
    }
 
    /**
     * 加载配置文件(默认加载jar包同级的文件夹下的内容)如果不存在加载jar文件夹中的配置
     * @param configPath 配置文件名包含路径
     * @return 
     * @throws java.io.IOException 
     */
    public static ApplicationContext LoadSpringContext(String configPath)throws IOException
    {
        File file=new File(System.getProperty("user.dir") + File.separator + configPath);
        if(file.exists()){
            System.out.println("加载Spring配置文件:"+file.getPath());
            return new ClassPathXmlApplicationContext("file:"+file.getCanonicalPath());
        }else{
            System.out.println("配置文件:"+file.getPath()+"不存在");
            System.out.println("加载默认配置文件");
            return new ClassPathXmlApplicationContext("classpath:"+configPath);
        }
    }
    
    /**
     * 加载日志配置
     * @param configPath 配置文件名 包含路径
     * @throws IOException 
     */
    public static void LoadLogConfig(String configPath)throws IOException
    {
        File file=new File(System.getProperty("user.dir") + File.separator + configPath);
        if(file.exists()){
            System.out.println("加载日志配置文件:"+file.getPath());
            Configurator.initialize(null,"file:"+file.getCanonicalPath());
        }else{
            System.out.println("配置文件:"+file.getPath()+"不存在");
            System.out.println("加载默认配置文件");
            Configurator.initialize(null, new ClassPathResource("classpath:"+configPath).getPath());
        }
    }
    
}
